package com.example.zlw.dem15;

import java.time.*;
import java.time.format.DateTimeFormatter;

/**
 * @program: Zlw
 * @description:
 * @author: 诸葛龙辰
 * @create: 2022-11-07 18:46
 **/
public class DataModel {
    public static void main(String[] args) {
        //指定日期
        LocalDate date = LocalDate.of(2001,03,01);
        //电脑的日期
        LocalDate nowData = LocalDate.now();
        System.out.println("指定日期："+ date);
        System.out.println("电脑日期"+nowData);
        //指定时间
        LocalTime time = LocalTime.of(12,12,12);
        //电脑的时间
        LocalTime nowTime = LocalTime.now();
        System.out.println("指定时间"+time);
        System.out.println("电脑的时间-"+nowTime);
        //指定的日期和时间
        LocalDateTime dateTime = LocalDateTime.of(2001,03,01,12,12,12);
        //电脑的日期和时间
        LocalDateTime dateTime1 = LocalDateTime.now();
        System.out.println("指定的日期时间" +dateTime);
        System.out.println("电脑的日期和时间"+dateTime1);
        System.out.println("=================进行时间格式的转换======================");
        System.out.println("这里是没有更改格式的时间--" +dateTime1);
        //日期时间默认格式转换成字符串
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH/mm/ss");
        String format = dateTimeFormatter.format(nowData);
        System.out.println("这里是格式改变后的日期和时间"+ format);
        /**
         * 将字符串换成日期时间格式
         */
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
        LocalDateTime dataTimeFormater=LocalDateTime.parse("2001-03-01",dateTimeFormatter1);
        System.out.println(dataTimeFormater);
        System.out.println("===========日期比较============");
        System.out.println("指定日期："+ date);
        System.out.println("电脑的日期"+nowData);
        Period period = Period.between(date,nowData);
        System.out.println("相差的年数量"+period.getYears());
        System.out.println("相差的月数量"+period.getMonths());
        System.out.println("相差的天数量"+period.getDays());
        System.out.println("==============日期比较==========");
        System.out.println("指定时间"+time);
        System.out.println("电脑时间"+nowTime);
        Duration duration =Duration.between(time,nowTime);
        System.out.println("相差的小时："+duration.toHours());
        System.out.println("相差的分钟："+duration.toMinutes());
        System.out.println("相差的秒："+duration.getSeconds());




    }
}


/**
 * 单列模式
 * 饿汉模式
 */

 class SiModel {
    //1.创建私有化构造函数
    private SiModel() {
/**
 * 2.声明一个静态的本类对象
 */
    }
    private static  SiModel siModel = new SiModel();
    /**
     * 3。提供一个静态方法，共外界获取该类对象
     */
    public  static  SiModel getSiModel(){
        return  siModel;
    }
}
/**
 * 懒汉形式  1
 */
class SiModel1{
    //1.创建私有化构造函数
    private SiModel1() {
/**
 * 2.声明一个静态的本类对象
 */
    }
    private static  SiModel1 siModel1 = new SiModel1();
    /**
     * 3。提供一个静态方法，共外界获取该类对象
     */
    public  static SiModel1 getSiModel(){
        return  siModel1;
    }
}
/**
 * 通过上面的懒汉形式可以看出再进行多线程的时候会出现线程安全问题，这里就需要我们进一步改变,通过线程中我们加锁的方法来进行解决线程问题*
 *懒汉形式No.02
 */
class SiModel2 {
    /**
     *  1.创建私有化构造函数
     */

    private SiModel2(){}
    /**
     * 2.声明一个静态的本类对象
     */
    private static SiModel2 siModel2=new SiModel2();
    /**
     * 3。提供一个静态方法，共外界获取该类对象
     */
    public static  SiModel2 getSingleModel2(){
        /**加锁
         *
         */
        synchronized (SiModel2.class){
            /**4.类加载不会导致该单实例对象被创建，而是首次使用该对象时才会创建
             *
             */
            if(siModel2==null){
                siModel2=new SiModel2();
            }
            return  siModel2;
        }
    }
}
/**
 * 在通过上面加锁解决了我们的线程安全问题并且还保留了懒汉形式，但同时在我们线程中如果一旦初始化完成就不存在了，所以还需要进行更新
 **      懒汉形式No.03
 */
class SiModel3 {
    /**
     *  1.创建私有化构造函数
     */
    private SiModel3(){}
    /**
     * 2.声明一个静态的本类对象
     */
    private static SiModel3 siModel3=new SiModel3();
    /**
     * 3。提供一个静态方法，共外界获取该类对象
     */
    public static SiModel3 getSingleModel3(){
        /**在锁的外面进行一个判断，也就是在加一层锁判断
         *
         */
        if(siModel3==null){
            /**加锁
             *
             */
            synchronized (SiModel3.class){
                /**4.类加载不会导致该单实例对象被创建，而是首次使用该对象时才会创建
                 *
                 */
                if(siModel3==null){
                    siModel3=new SiModel3();
                }
            }
        }
        return siModel3;
    }
}
/**
 * 进行了三次更新后我们再去测试一下，就可以看出这样就会保证了线程安全，也保证了初始化之后的安全问题
 * */






















